#include <iostream>

/**
 * C++ 纯虚函数
 *
 * 您可能想要在基类中定义虚函数，以便在派生类中重新定义该函数更好地适用于对象，但是您在基类中又不能对虚函数给出有意义的实现，这个时候就会用到纯虚函数。
 *
 * 纯虚函数是没有实现的虚函数，在基类中用 = 0 来声明。
 * 纯虚函数表示基类定义了一个接口，但具体实现由派生类负责。
 * 纯虚函数使得基类变为抽象类（abstract class），无法实例化。
 *
 *
 * 特点：
 *
 * 必须在基类中声明为 = 0： 表示没有实现，子类必须重写。
 * 抽象类：包含纯虚函数的类不能直接实例化，必须通过派生类实现所有纯虚函数才能创建对象。
 * 接口定义： 纯虚函数通常用于定义接口，让派生类实现具体行为
 */

class Shape{
public:
    virtual int area() = 0; // 纯虚函数，强制子类实现此方法
};

class Rectangle : public Shape{
private:
    int width,height;
public:
    Rectangle(int a = 0,int b = 0) : width(a),height(b){}

    //实现纯虚函数
    int area() override{
        return width * height;
    }
};

/***
 * 特性               虚函数(Virtual Function)         纯虚函数(Pure Virtual Function)
 *
 * 定义               基类中使用virtual声明，有实现      基类中试用 =0 声明，无实现
 *
 * 子类重写            子类可以选择重写                  子类必须重写
 *
 * 抽象性              可以实例化                       使类变为抽象类，无法实例化
 *
 * 用途                提供默认行为，允许子类重写         定义接口，强制子类实现具体行为
 *
 */
int main() {
    Shape *shape = new Rectangle(10,5);
    std::cout << "Rectangle area: " << shape->area() << std::endl;
    delete shape;
    return 0;
}
